A8: Creación de una visualización data storytelling (PEC3)¶

Visualización de datos. Máster Universitario en Ciencia de Datos.¶

Autor: Rubén Moya Vázquez 18/05/2022


Descripción y enunciado¶

El objetivo de esta prueba de evaluación continua es que el estudiante sea capaz de crear una narrativa de datos con técnicas de visualización, es decir, una visualización tipo storytelling. Hans Rossling, unos de los líderes de narrativa de datos, en uno de sus famosos videos comenta: "Tener los datos no es suficiente, hay que mostrarlos de forma que la gente los disfrute y los entienda".

Un 2021 Musical: Analisis del top 200 de Spotify en España¶

Partiendo del dataset Spotify Charts que contiene los datos de las listas 'Top 200' y 'Viral 50' de una serie de paises desde 2017 a finales de 2021, analizaremos como ha sido el año pasado a nivel musical en España.

¿A que le hemos cantado el año pasado?¶

Hay canciones de amor, canciones de fiesta, canciones tristes y canciones épicas... Cada momento tiene una canción (o una decena) que le cuadra perfectamente. Por eso, queremos saber a que le hemos cantado este 2021. Para ello, nos ayudaremos de la siguiente nube de palabras, que nos hará ver que es lo que más se ha mencionado en los titulos de las caciones.

In [ ]:
# Importing needed libraries
import os
from nltk.corpus import stopwords
from PIL import Image
from wordcloud import WordCloud
from raceplotly.plots import barplot
import pandas as pd
import numpy as np
from datetime import datetime
import plotly.graph_objects as go
import matplotlib.pyplot as plt
%matplotlib inline
import plotly.io as pio
pio.renderers.default = 'notebook'
import warnings
warnings.filterwarnings('ignore')
In [ ]:
# Collect the data
chart = pd.read_csv(os.path.join(os.getcwd(), "charts.csv"))
chart = chart.drop(chart[chart.chart == "top50"].index)
chart['date'] =  pd.to_datetime(chart["date"], format='%Y-%m-%d')
spain_chart = chart[(chart.date >= datetime.strptime('2021-01-01', '%Y-%m-%d')) & (chart.region == 'Spain')]

def get_dates(charts:pd.DataFrame) -> list:
    return  charts.date.unique()

def get_words(chart:pd.DataFrame) -> str:
    all_words = ""
    punctuationCharacters = [".", "?", "!", ",", ";", ":", '¿', '¡', '(', ')', '&', '-']
    other = ["feat", "remix", "remastered", "la", "el", "cuando", "mi", "como", "yo", 
    "tu", "él", "qué", "que", "lo", "un", "una", 'a', 'ante', 'bajo', 'cabe', 'con', 
    'contra', 'de', 'desde', 'durante', 'en', 'entre', 'hacia', 'hasta', 'mediante',
    'para', 'por', 'según', 'sin', 'so', 'sobre', 'tras', 'si', 'cómo', 'pa', 'version', 'mix']
    for titulo in chart.title.unique():
        
        for elem in punctuationCharacters:
            titulo = titulo.replace(elem, '')

        palabras = titulo.split(' ')
        for palabra in palabras:
            if (palabra.lower() not in stopwords.words('spanish')) and (palabra.lower() not in other):
                all_words += ' '
                all_words += palabra

    return all_words

def get_artists_scores(chart:pd.DataFrame) -> pd.DataFrame:
    artists = []
    songs = []
    streams = []
    max_streams = []
    mean_streams = []
    for elem in chart.artist.unique():
        for x in elem.replace('...', '').replace('(', '').replace(')', '').split(','):
            if x.strip() not in artists:
                artists.append(x.strip())
    
    artists = list(dict.fromkeys(artists))
 
    for person in artists:
        artist_data = chart.loc[chart.artist.str.contains(person, na=False)]
        songs.append(len(artist_data.index.values))
        streams.append(artist_data.streams.sum())
        max_streams.append(artist_data.streams.max())
        mean_streams.append(artist_data.streams.mean())

    full_data = {
        'artist': artists,
        'songs': songs,
        'streams': streams,
        'max': max_streams,
        'mean': mean_streams
    }

    full = pd.DataFrame.from_dict(full_data)

    return full.sort_values(by='streams', ascending=False)

# Create a word cloud image
wc = WordCloud(background_color="white", max_words=1000)
# Generate a wordcloud
wc.generate(get_words(spain_chart))

# show
plt.figure(figsize=[30,5])
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()
2022-05-17T19:59:31.419713 image/svg+xml Matplotlib v3.5.2, https://matplotlib.org/

Como podemos ver, le hemos cantado al amor, a la noche y a lo que disfrutamos de ella. A los besos que nos ponen la Piel de Gallina y a quien queremos darselos (a mamá y a la/el Baby girl/boy), al perreo, al veneno a Madrid y al Mundo entero. Después de un año como este 2021 le hemos cantado a todo lo que nos hace recordar lo que nos había robado el Covid-19.

Como mención especial, cabe destacar que un hasta hace nada desconocido Bizarrap o Bzrp se coló en nuestras vidas con sus sesiones desde su cuarto, haciendose un hueco entre famosos de talla mundial como Taylor Swift, Doja Cat o Rosalía.

¿Qué canciones escuchamos en bucle?¶

Ya sabemos a qué le hemos cantado, pero... ¿Qué es exactamente lo que hemos cantado? Para averiguarlo, vamos a ver la evolución del Top 10 nacional durante este ulitmo año.

In [ ]:
my_raceplot = barplot(spain_chart,  item_column='title', value_column='streams', time_column='date')
my_raceplot.plot(title='Top Canciones España (2021)', item_label = 'Top 10 Canciones', value_label = 'Reproducciones diarias', time_label = 'Fecha: ', frame_duration = 600)

Empezamos al año bien cargaditos de raggaetón, con ganas de fiesta y de bailar y de repente, a finales de febrero, llegó Puchito (C. Tangana) a conquistarnos a todos con su opera magna El Madrileño llegando a tener prácticamente el Top 10 entero para el solito durante 20 días (aunque se le escapó el nº 1).

A finales de abril apareció el tema Pareja del año de Sebastián Yatra y Myke Towers que apuntaba a ser la primera candidata a canción del verano llegando casi a 600.000 reproducciones diarias. Pero ese triunfo sería fugaz pues el 25 de mayo llegó Rauw Alejandro a reventar las listas internacionales con la canción que conquistó nuestros auriculares, altavoces, radios y discotecas durante varios meses: Todo de ti. ¡Ojo! ¡Que llegó a tener un pico de 1.676.000 reproducciones diarias el 29 de mayo... ¡Se dice rápido! La canción siguió peleando el primer puesto hasta mediados de julio, cuando la fiestera Pepas le dió el relevo.

En otoño nos pusimos Nostálgicos, y Aitana y zzolio nos robaron el corazón con su Mon Amour; volvimos a creer gracias al Ateo de C. Tangana y Nathy Peluso y Rosalía se acompañó por The Weeknd para recordarnos lo mála amante que es La Fama y dejarnos ver lo que nos esperaba en 2022 con su Motomami.

¿Quien se ha llevado la corona?¶

Sabemos a qué le hemos cantado, qué le hemos cantado, cuando se lo hemos cantado, pero... ¿Quienes han sido los principales responsables de que lo hayamos cantado? Bueno, pues veamoslo...

In [ ]:
top10 = get_artists_scores(spain_chart)[0:10]

fig = go.Figure()
fig.add_trace(go.Bar(
    x=top10['artist'].values,
    y=top10['max'].values,
    name='Máximo',
    marker_color='green'
))
fig.add_trace(go.Bar(
    x=top10['artist'].values,
    y=top10['mean'].values,
    name='Media',
    marker_color='lightgreen'
))

# Here we modify the tickangle of the xaxis, resulting in rotated labels.
fig.update_layout(barmode='group', xaxis_tickangle=-45, title_text='Top 10 de artistas más escuchados (reproducciones diarias)')
fig.show()

NOTA: *Para calcular la media se ha utilizando las reproducciones de cada cancion del autor que ha estado en el top 200 entre el total de entradas en el top 200 de dicho autor.

In [ ]:
fig = go.Figure()
fig.add_trace(go.Bar(
    x=top10['artist'].values,
    y=top10['streams'].values,
    name='Reproducciones',
    marker_color='darkgreen'
))
fig.update_layout( xaxis_tickangle=-45, title_text='Top 10 de artistas más escuchados (total reproducciones)')
fig.show()

¡¿Confirmamos que ha sido el año de Rauw Alejandro y Myke Towers?! ¡Lo confirmamos! Como se puede ver en ambas gráficas, los dos puertoriqueños han sido los reyes de Spotify durante el 2021. Si bien el segundo no ha tenido unas cifras excesivamente altas en cuanto a pico máximo de reproducciones diarias ni en media, su constante presencia en el top 200 le ha dado la segunda posición. Por el contrario lo de Rauw Alejandro ha sido la viva representación del dicho "veni, vidi, vici". Apareció reventando las listas llegando a más de millón y medio de reproducciones diarias para acabar el año con un total de... ¡¡627 millones de reproducciones!!

Como mención especial hay que dar un premio a la constancia a Jhay Cortez que consiguió llegar al cuarto puesto en total de reproducciones teniendo la media más alta de todos los presentes.

Esto es to... esto es to.. esto es todo amigos.¶

Y con esto acaba nuestro resumen del 2021 más musical de la mano de Spotify. Puede que ni las canciones, ni los artistas, ni los generos sean de gusto de muchos de los que leais esta retrospectiva, pero 'el pueblo ha cantado' y estos datos son el resultado del ejercicio (democratico) de menear las caderas.

¡Muchas gracias a todos!¶